import { BaseData } from '@shared/models/base-data';
import { FormBuilder, FormGroup } from '@angular/forms';
import { PageComponent } from '@shared/components/page.component';
import { ChangeDetectorRef, Directive, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { PageLink } from '@shared/models/page/page-link';
import { TableConfig } from '@shared/models/table/table-config.models';
import { deepTrim, isEqual } from '@shared/utils';
import { ItemAction } from '@shared/models/table/table-data.models';

/**
 * 项目表单组件基类
 * 
 * 用于在对话框或详情面板中创建和编辑表格项的表单组件
 * 
 * 功能特性：
 * - 自动表单状态管理（编辑/只读）
 * - 表单数据验证
 * - 与 TableConfig 集成
 * - 支持添加和编辑模式
 * 
 * 使用方式：
 * ```typescript
 * @Component({...})
 * export class MyItemComponent extends ItemComponent<MyData> {
 *   constructor(fb: FormBuilder, cd: ChangeDetectorRef) {
 *     super(fb, cd);
 *   }
 * 
 *   buildForm(entity: MyData): FormGroup {
 *     return this.fb.group({
 *       name: [entity?.name || '', Validators.required],
 *       email: [entity?.email || '', [Validators.required, Validators.email]]
 *     });
 *   }
 * 
 *   updateForm(entity: MyData): void {
 *     if (entity) {
 *       this.entityForm.patchValue({
 *         name: entity.name,
 *         email: entity.email
 *       });
 *     }
 *   }
 * }
 * ```
 */
@Directive()
export abstract class ItemComponent<T extends BaseData,
  P extends PageLink = PageLink,
  L extends BaseData = T,
  C extends TableConfig<T, P, L> = TableConfig<T, P, L>> 
extends PageComponent implements OnInit {

  /**
   * 表单组
   */
  itemForm!: FormGroup;

  /**
   * 是否为编辑模式
   */
  isEditValue: boolean = false;

  /**
   * 表格配置
   */
  protected tableConfigValue!: C;

  /**
   * 当前实体数据
   */
  protected itemValue!: T;

  /**
   * 表格配置输入（通过注入器提供）
   */
  @Input()
  set tableConfig(tableConfig: C) {
    this.setTableConfig(tableConfig);
  }

  get tableConfig(): C {
    return this.tableConfigValue;
  }

  @Input()
  set isEdit(isEdit: boolean) {
    this.isEditValue = isEdit;
    this.cd.markForCheck();
    this.updateFormState();
  }

  get isEdit() {
    return this.isEditValue;
  }

  get isAdd(): boolean {
    return this.itemValue && !this.itemValue.id;
  }

  @Input()
  set item(item: T) {
    this.itemValue = item;
    if (this.itemForm) {
      this.itemForm.markAsPristine();
      this.updateForm(item);
    }
  }

  get item(): T {
    return this.itemValue;
  }

  @Output()
  itemAction = new EventEmitter<ItemAction<T>>();

  protected constructor(
    protected fb: FormBuilder,
    protected cd: ChangeDetectorRef
  ) {
    super();
  }

  ngOnInit(): void {
    // 初始化表单
    this.itemForm = this.buildForm(this.itemValue);
  }

  /**
   * 更新表单状态（启用/禁用）
   */
  protected updateFormState(): void {
    if (this.itemForm) {
      if (this.isEditValue) {
        this.itemForm.enable({ emitEvent: false });
      } else {
        this.itemForm.disable({ emitEvent: false });
      }
    }
  }

  /**
   * 获取表单值（用于提交）
   */
  itemFormValue() {
    const formValue = this.itemForm ? { ...this.itemForm.getRawValue() } : {};
    return this.prepareFormValue(formValue);
  }

  protected prepareFormValue(formValue: any): any {
    return deepTrim(formValue);
  }

  /**
   * 设置表格配置（子类可以重写此方法）
   */
  protected setTableConfig(tableConfig: C): void {
    this.tableConfigValue = tableConfig;
  }

  /**
   * 构建表单（抽象方法，子类必须实现）
   */
  abstract buildForm(item: T): FormGroup;

  /**
   * 更新表单数据（抽象方法，子类必须实现）
   */
  abstract updateForm(item: T): void;
}
